//
// Created by wujehy on 2020/7/11.
//

#include <iostream>
#include "TimerTask.h"

//定时任务 组建测试
// 原理: 启动一个线程　每秒钟　在　任务队列　查询　是否右任务　，有　则执行
using namespace GeeJoan::Common;

int main()
{
    TimerTask timerTask;
    //  可以提前初始化
    timerTask.init();
// 获取当前时间
    int64_t currentTime = timerTask.getCurrentTime();
// 5 秒后运行的 任务
    timerTask.addTask( currentTime + 5, []()
    {
        std::cout << " hello 5 s" << std::endl;
    } );
// 3 秒后运行的 任务
    timerTask.addTask( currentTime + 3, []()
    {
        std::cout << " hello 3 s" << std::endl;
    } );

    //
    int64_t tid1 = timerTask.addTask( currentTime + 6, []()
    {
        // 这个是要被 移除的任务 所以这里不会打印
        std::cout << " hello 6 s hello , test romve " << std::endl;
    } );

   timerTask.addTask( currentTime + 4 , [&]()
    {
        std::cout << " hello 4 s and stop 6s " << std::endl;
        // 将tid1 的 任务 移除
        timerTask.removeTask(tid1);
    } );
    //
    timerTask.addTask( currentTime + 6, []()
    {
        // 正常的 6秒的任务
        std::cout << " hello 6 s hello   " << std::endl;
    } );

    //7 秒的 多个任务
    timerTask.addTask( currentTime + 7, []()
    {
        std::cout << " hello 7 s hello 1  " << std::endl;
    } );

    //7 秒的 多个任务
    timerTask.addTask( currentTime + 7, []()
    {
        std::cout << " hello 7 s hello 2  " << std::endl;
    } );
    //7 秒的 多个任务
    timerTask.addTask( currentTime + 7, []()
    {
        std::cout << " hello 7 s hello 3  " << std::endl;
    } );

    timerTask.addTask( currentTime + 8, [&]()
    {
        std::cout << " hello 8 s hello   " << std::endl;
        // 停止 任务
        timerTask.setDoRun( false);
    } );

    // 8 秒的时候 停止了 , 所以这个里不会执行
    timerTask.addTask( currentTime + 9, [&]()
    {
        std::cout << " hello 9 s hello   " << std::endl;
        // 停止 任务
    } );
    //   等待结束
    timerTask.join();

    /**
     * output:
     *   hello 3 s
     *   hello 4 s and stop 6s
     *   hello 5 s
     *   hello 6 s hello
     *   hello 7 s hello 1
     *   hello 7 s hello 2
     *   hello 7 s hello 3
     *   hello 8 s hello
     */
}